package com.divemotor.ventarepuestosinternet.service.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.divemotor.ventarepuestosinternet.dao.PerfilDAO;
import com.divemotor.ventarepuestosinternet.dao.TipoDocumentoDAO;
import com.divemotor.ventarepuestosinternet.dao.UsuarioClienteDAO;
import com.divemotor.ventarepuestosinternet.dao.UsuarioDAO;
import com.divemotor.ventarepuestosinternet.exception.DivemotorBusinessException;
import com.divemotor.ventarepuestosinternet.model.Perfil;
import com.divemotor.ventarepuestosinternet.model.TipoDocumento;
import com.divemotor.ventarepuestosinternet.model.Usuario;
import com.divemotor.ventarepuestosinternet.model.UsuarioCliente;
import com.divemotor.ventarepuestosinternet.service.UsuarioClienteService;
import com.divemotor.ventarepuestosinternet.util.Constantes;
import com.divemotor.ventarepuestosinternet.util.DatosDeSession;
import com.divemotor.ventarepuestosinternet.util.Encriptacion;
import com.divemotor.ventarepuestosinternet.util.FechasUtil;

@Service(value="usuarioClienteService")
@Transactional(rollbackFor=Exception.class)
public class UsuarioClienteServiceImpl implements UsuarioClienteService, Serializable {

	private static final long serialVersionUID = -1076165531588385266L;

	@Autowired
	private TipoDocumentoDAO tipoDocumentoDAO;	
	
	@Autowired
	private UsuarioClienteDAO usuarioClienteDAO;
	
	@Autowired
	private UsuarioDAO usuarioDAO;
	
	@Autowired
	private PerfilDAO perfilDAO;
	
	@Override
	public List<UsuarioCliente> listarUsuariosPorCliente(UsuarioCliente usuarioCliente) throws DivemotorBusinessException {
		return usuarioClienteDAO.listarUsuariosPorCliente(usuarioCliente);
	}

	@Override
	public void insertar(UsuarioCliente usuarioCliente) throws DivemotorBusinessException {
		
		List<Perfil> perfiles = new ArrayList<Perfil>();
		perfiles.add(new Perfil(Constantes.ID_PERFIL_CLIENTE));
		usuarioCliente.setUsuarioCreacion(DatosDeSession.obtenerUsuarioAutenticado());
		usuarioCliente.setFechaCreacion(FechasUtil.obtenerFechaActual());
		usuarioCliente.getUsuario().setListaPerfiles(perfiles);
		usuarioCliente.getUsuario().setPais(DatosDeSession.obtenerPaisDelUsuarioAutenticado());
		usuarioCliente.getUsuario().setContrasenia(Encriptacion.encriptarMD5(usuarioCliente.getUsuario().getContrasenia()));
		usuarioCliente.getUsuario().setListaPerfiles(perfiles);
	
	    Usuario user = usuarioDAO.obtenerPorUsuarioLogin(usuarioCliente.getUsuario());
	
	    if(user!=null){
			if(user.getListaPerfiles().size()==0){
				user.setApellidos(usuarioCliente.getUsuario().getApellidos());
				user.setContrasenia(usuarioCliente.getUsuario().getContrasenia());
				user.setCorreo(usuarioCliente.getUsuario().getCorreo());
				user.setListaPerfiles(usuarioCliente.getUsuario().getListaPerfiles());
				user.setNombres(usuarioCliente.getUsuario().getNombres());
				user.setPais(usuarioCliente.getUsuario().getPais());
				user.setUsuario(usuarioCliente.getUsuario().getUsuario());
				usuarioCliente.setUsuario(user);
				usuarioClienteDAO.insertar(usuarioCliente);
	  		    usuarioDAO.actualizarUsuarioExistente(user);
			}
		}else{
		    usuarioDAO.insertar(usuarioCliente.getUsuario());
			usuarioClienteDAO.insertar(usuarioCliente);
		
		}
	}

	@Override
	public void actualizar(UsuarioCliente usuarioCliente) throws DivemotorBusinessException {
	    usuarioCliente.setUsuarioModificacion(DatosDeSession.obtenerUsuarioAutenticado());
	    usuarioCliente.setFechaModificacion(FechasUtil.obtenerFechaActual());
	    usuarioDAO.actualizar(usuarioCliente.getUsuario());
		usuarioClienteDAO.actualizar(usuarioCliente);
	}

	@Override
	public void eliminar(UsuarioCliente usuarioCliente) throws DivemotorBusinessException {
	    usuarioCliente.setUsuarioEliminacion(DatosDeSession.obtenerUsuarioAutenticado());
	    usuarioCliente.setFechaEliminacion(FechasUtil.obtenerFechaActual());
	    usuarioCliente.setEstado(Constantes.ESTADO_ELIMINADO);
	    List<Perfil> listaPerfils = new ArrayList<Perfil>();
	    usuarioCliente.getUsuario().setListaPerfiles(listaPerfils);
		usuarioClienteDAO.eliminar(usuarioCliente);
		usuarioDAO.eliminar(usuarioCliente.getUsuario()); 
	}

	@Override
	public List<TipoDocumento> listarTipoDocumento() throws DivemotorBusinessException {
		return tipoDocumentoDAO.listar();
	}

	@Override
	public UsuarioCliente obtenerPorId(UsuarioCliente usuarioCliente) throws DivemotorBusinessException {
		return usuarioClienteDAO.obtenerPorId(usuarioCliente);
	}
	
	@Override
	public UsuarioCliente obtenerUsuarioClientePorUsuario(Usuario usuario) throws DivemotorBusinessException {
		UsuarioCliente usuarioCliente = usuarioClienteDAO.obtenerUsuarioClientePorUsuario(usuario);
		return usuarioCliente;
	}

}
